package tools;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;






/**
 * Classe de racinisation (stemming) des mots
 * en franÔøΩais.
 * Modification lÔøΩgÔøΩre du package SnowBall
 * http://snowball.tartarus.org/download.php
 * @author xtannier
 *
 */
public class FrenchStemmer extends org.tartarus.snowball.ext.frenchStemmer implements Normalizer {

	private static short REPEAT = 1;

	private ArrayList<String> stopWords;

	public FrenchStemmer() {
		this.stopWords = new ArrayList<String>();
	}

	public FrenchStemmer(String stopWordFileName) throws IOException {
		this.stopWords = new ArrayList<String>();
		//lecture du fichier texte	
		InputStream ips=new FileInputStream(stopWordFileName); 
		InputStreamReader ipsr=new InputStreamReader(ips);
		BufferedReader br=new BufferedReader(ipsr);
		String line;
		while ((line=br.readLine())!=null){
			this.stopWords.add(line);
		}
		br.close(); 
	}


	public ArrayList<String> normalize(String fileName) throws IOException {		
		String text = "";
		//lecture du fichier texte	
		InputStream ips=new FileInputStream(fileName); 
		InputStreamReader ipsr=new InputStreamReader(ips);
		BufferedReader br=new BufferedReader(ipsr);
		String line;
		while ((line=br.readLine())!=null){
			text += line + " ";
		}
		br.close(); 

		ArrayList<String> words = (new FrenchTokenizer()).tokenize(text.toLowerCase());
		ArrayList<String> result = new ArrayList<String>();
		for (String word : words) {
			// on ajoute le mot dans la liste s'il n'appartient pas ÔøΩ la liste des mots-clÔøΩs.
			// IdÔøΩalement il faudrait utiliser une structure de donnÔøΩes plus efficace que la liste,
			// mais ce n'est pas le sujet.
			this.setCurrent(word);
			for (int i = REPEAT; i != 0; i--) {
				this.stem();
			}
			result.add(this.getCurrent());
		}
		return result;
	}


	// Surcharge de normalize qui prend en parametre le contenu d'un fichier en ArrayList
	// Surcharge de normalize qui prend en parametre le contenu d'un fichier en ArrayList
	public ArrayList<String> normalize_ok(ArrayList<String> fileContent, ArrayList<String> URL_title, boolean removeStopWords, boolean doUrl) throws IOException {

		String text = fileContent.toString();

		


		int i;


		ArrayList<String> words = (new FrenchTokenizer()).tokenize(text.toLowerCase(), removeStopWords);

		ArrayList<String> result = new ArrayList<String>();

		for (String word : words) {

			// on ajoute le mot dans la liste s'il n'appartient pas ? la liste des mots-cl?s.

			// Id?alement il faudrait utiliser une structure de donn?es plus efficace que la liste,

			// mais ce n'est pas le sujet.

			this.setCurrent(word);

			for (i = REPEAT; i != 0; i--) {

				this.stem();

			}

			result.add(this.getCurrent());

		}

		return result;

	}

	public static void main(String[] args) {
		String stopWordFileName = "/Users/poko/Dropbox/Cours/S9/EIT/frenchST.txt";
		String word = "/home/xtannier/tmp/texte.txt";
		try {
			Normalizer stemmer = new FrenchStemmer(stopWordFileName);
			System.out.println(stemmer.normalize(word));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public ArrayList<String> normalize(String fileName, boolean removeStopWords)
			throws IOException {
		String text = "";
		//lecture du fichier texte	
		InputStream ips=new FileInputStream(fileName); 
		InputStreamReader ipsr=new InputStreamReader(ips);
		BufferedReader br=new BufferedReader(ipsr);
		String line;
		while ((line=br.readLine())!=null){
			text += line + " ";
		}
		br.close(); 

		ArrayList<String> words = (new FrenchTokenizer()).tokenize(text.toLowerCase());
		ArrayList<String> result = new ArrayList<String>();
		for(String word : words){
			if(!removeStopWords || !(this.stopWords.contains(word))){
				this.setCurrent(word);
				for (int i = REPEAT; i != 0; i--) {
					this.stem();
				}
				result.add(this.getCurrent());
			}
		}
		return null;
	}
}
